package net.whatmark.playavillain.meshikau.page;

import javax.servlet.http.HttpServletRequest;

import org.t2framework.t2.annotation.composite.POST;
import org.t2framework.t2.annotation.core.ActionParam;
import org.t2framework.t2.annotation.core.Default;
import org.t2framework.t2.annotation.core.Page;
import org.t2framework.t2.annotation.core.SessionAttr;
import org.t2framework.t2.contexts.Request;
import org.t2framework.t2.contexts.Session;
import org.t2framework.t2.contexts.WebContext;
import org.t2framework.t2.navigation.Forward;
import org.t2framework.t2.navigation.Redirect;
import org.t2framework.t2.spi.Navigation;

/**
 * {@.en  }
 *
 * <br />
 *
 * {@.ja このサンプルでは、0.4から加わった新機能の{@code @SessionAttr}の使い方をご紹介します.}
 * このサンプルは以下のURLで呼ばれます.このコンポーネントはLucyの設定ファイルによって管理されています.
 *
 * http://yourdomain/context-root/sessionattr }
 *
 * @since 0.4
 * @author shot
 */
@Page("sessionattr")
public class SessionAttrPage {

	/**
	 * {@.en  }
	 *
	 * <br />
	 *
	 * {@.ja デフォルトメソッドです. }
	 */
	@Default
	public Navigation index(WebContext context) {
		context.getSession().setAttribute("hoge", "HOGE");
		return Redirect.to("/pages/sessionAttr.jsp");
	}

	/**
	 * {@.en  }
	 *
	 * <br />
	 *
	 * {@.ja {@code @SessionAttr}はSession内に入っている値を引数として渡す引数アノテーションです.
	 *
	 * @SessionAttr("hoge")のように、キー名は必須で指定します.キー名にない値はデフォルトではnullがインジェクトされます. null値を許容したく無い場合は、nullable属性をfalseにすると例外が発生し、このメソッドは呼ばれません.}
	 */
	@POST
	@ActionParam
	public Navigation message(@SessionAttr("hoge") String hoge,
			@SessionAttr("no_such_attr") String nosuchAttr, WebContext context) {
		Request request = context.getRequest();
		Session session = context.getSession();
		request.setAttribute("message1", "hoge key value" + " : " + hoge);
		request.setAttribute("message2", "no_such_attr key value" + " : "
				+ nosuchAttr);
		session.setAttribute("aaaaaa", new NotSerializableHoge());
		return Forward.to("/pages/sessionAttr.jsp");
	}

	/**
	 * {@.en  }
	 *
	 * <br />
	 *
	 * {@.ja nullable属性をfalseにした場合のサンプルです.}
	 *
	 * @param hoge
	 * @param nosuchAttr
	 * @param request
	 * @return
	 */
	@POST
	@ActionParam
	public Navigation messageError(
			@SessionAttr("hoge") String hoge,
			@SessionAttr(value = "no_such_attr", nullable = false) String nosuchAttr,
			HttpServletRequest request) {
		// nullable = falseのとき、ここには来ない.
		request.setAttribute("message1", "hoge key value" + " : " + hoge);
		request.setAttribute("message2", "no_such_attr key value" + " : "
				+ nosuchAttr);
		return Forward.to("/pages/sessionAttr.jsp");
	}

	public static class NotSerializableHoge {

	}
}
